package cl.mt.mvc.action.transportista;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import cl.mt.dto.DTOOfertaVehiculo;
import cl.mt.dto.DTORemolque;
import cl.mt.dto.DTOUsuario;
import cl.mt.dto.DTOVehiculo;
import cl.mt.mvc.action.transportista.helper.FiltroTransportistaDTO;
import cl.mt.mvc.action.transportista.helper.TransportistaHelper;
import cl.mt.mvc.helper.UsuarioHelper;
import cl.mt.util.Utiles;

public class Publicaciones extends Action {
	private Logger log = LogManager.getLogger(Publicaciones.class.getName());
	private static String FORMATO_FECHA = "dd/MM/yyyy";

	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {

		String accion = request.getParameter("accion");
		log.debug("Accion Publicaciones [" + accion + "]");

		// Buscamos los datos del Usuario Conectado.
		UsuarioHelper userHelper = new UsuarioHelper();
		DTOUsuario userDto = userHelper.getUserConectado(request);
		if (userDto == null) {
			log.error("Usuario No se encuentra Logeado");
			return mapping.findForward("ERROR");
		}

		if (accion == null || "listado".equals(accion))
			return listado(mapping, userDto, request);

		if ("ver".equals(accion))
			return view(mapping, userDto, request);
		if ("editar".equals(accion))
			return edit(mapping, userDto, request);
		if ("borrar".equals(accion))
			return view(mapping, userDto, request);
		if ("eliminar".equals(accion))
			return delete(mapping, userDto, request);
		if ("crear".equals(accion))
			return create(mapping, userDto, request);

		return listado(mapping, userDto, request);
	}

	public ActionForward listado(ActionMapping mapping, DTOUsuario userDto, HttpServletRequest request) {

		String forward = "LISTADO";

		TransportistaHelper transHelper = new TransportistaHelper();
		FiltroTransportistaDTO filtroDto = getDatosFiltro(request);
		filtroDto.setIdUsuario(userDto.getId());
		List<DTOOfertaVehiculo> listaPublicaciones = transHelper.getListaPublicaciones(filtroDto);

		// Retornamos.
		request.setAttribute("listaPublicaciones", listaPublicaciones);
		return mapping.findForward(forward);

	}

	public ActionForward view(ActionMapping mapping, DTOUsuario userDto, HttpServletRequest request) {

		String forward = "VER";

		Integer idPublicacion = Utiles.parseInteger(request.getParameter("idPublicacion"));

		// Buscamos los datos del Publicacion.

		TransportistaHelper transHelper = new TransportistaHelper();
		DTOOfertaVehiculo dtoPublicacion = transHelper.getPublicacion(idPublicacion);
		if (dtoPublicacion != null && dtoPublicacion.getIdVehiculo() != null) {
			DTOVehiculo dtoVehiculo = transHelper.getVehiculo(dtoPublicacion.getIdVehiculo());
			request.setAttribute("DatoVehiculo", dtoVehiculo);
		}

		if (dtoPublicacion != null && dtoPublicacion.getIdRemolque() != null) {
			DTORemolque dtoRemolque = transHelper.getRemolque(dtoPublicacion.getIdRemolque());
			request.setAttribute("DatoRemolque", dtoRemolque);
		}

		// Retornamos.
		if ("borrar".equals(request.getParameter("accion")))
			request.setAttribute("hayQueBorrar", "S");
		request.setAttribute("DatoPublicacion", dtoPublicacion);
		return mapping.findForward(forward);

	}

	public ActionForward edit(ActionMapping mapping, DTOUsuario userDto, HttpServletRequest request) {

		String forward = "EDITAR";

		Integer idPublicacion = Utiles.parseInteger(request.getParameter("idPublicacion"));

		// Buscamos los datos del Publicacion.

		TransportistaHelper transHelper = new TransportistaHelper();
		DTOOfertaVehiculo dtoPublicacion = transHelper.getPublicacion(idPublicacion);
		if (dtoPublicacion != null && dtoPublicacion.getIdVehiculo() != null) {
			DTOVehiculo dtoVehiculo = transHelper.getVehiculo(dtoPublicacion.getIdVehiculo());
			request.setAttribute("DatoVehiculo", dtoVehiculo);
		}

		List<DTOVehiculo> listaVehiculos = transHelper.getListaVehiculos(userDto.getId());
		List<DTORemolque> listaRemolques = transHelper.getListaRemolques(userDto.getId());
		request.setAttribute("ListaVehiculos", listaVehiculos);
		request.setAttribute("ListaRemolques", listaRemolques);

		// Retornamos.
		request.setAttribute("DatoPublicacion", dtoPublicacion);
		return mapping.findForward(forward);

	}

	public ActionForward delete(ActionMapping mapping, DTOUsuario userDto, HttpServletRequest request) {

		String forward = "RESULTADO";

		Integer idPublicacion = Utiles.parseInteger(request.getParameter("idPublicacion"));

		// Buscamos los datos del Publicacion.
		TransportistaHelper transHelper = new TransportistaHelper();
		DTOOfertaVehiculo dtoPublicacion = transHelper.getPublicacion(idPublicacion);

		request.setAttribute("MsgRespuesta", "Publicacion eliminado Correctamente");
		if (dtoPublicacion == null) {
			log.debug("Publicacion NO existe");
			request.setAttribute("MsgRespuesta", "Publicacion no Existe");
			return mapping.findForward(forward);
		}

		int res = transHelper.deletePublicacion(idPublicacion);
		if (res == 0) {
			log.debug("Error. No se pudo eliminar Publicacion");
			request.setAttribute("MsgRespuesta", "Error. No se pudo Eliminar Publicacion");
		}

		// Retornamos.
		return mapping.findForward(forward);

	}

	public ActionForward create(ActionMapping mapping, DTOUsuario userDto, HttpServletRequest request) {

		String forward = "RESULTADO";

		DTOOfertaVehiculo dtoPublicacion = getDatosPublicacion(request);
		dtoPublicacion.setIdUsuario(userDto.getId());

		// Buscamos los datos del Publicacion.
		TransportistaHelper transHelper = new TransportistaHelper();

		DTOOfertaVehiculo dtoRespuesta = transHelper.createPublicacion(dtoPublicacion);
		if (dtoRespuesta == null) {
			log.debug("Error. No se pudo crear Publicacion");
			request.setAttribute("MsgRespuesta", "Error. No se pudo Crear Publicacion");
		}
		// Retornamos.
		request.setAttribute("DatoPublicacion", dtoRespuesta);
		return mapping.findForward(forward);

	}

	private DTOOfertaVehiculo getDatosPublicacion(HttpServletRequest request) {

		DTOOfertaVehiculo dto = new DTOOfertaVehiculo();
		dto.setId(Utiles.parseInteger(request.getParameter("idPublicacion")));

		dto.setFechaDesde(Utiles.stringToDate(request.getParameter("fechaDesde"), FORMATO_FECHA));
		dto.setFechaHasta(Utiles.stringToDate(request.getParameter("fechaHasta"), FORMATO_FECHA));

		dto.setIdVehiculo(Utiles.parseInteger(request.getParameter("idVehiculo")));
		dto.setIdRemolque(Utiles.parseInteger(request.getParameter("idRemolque")));
		dto.setComentario(Utiles.sinNull(request.getParameter("observacion"), ""));

		dto.setIdPaisOrigen(Utiles.parseInteger(request.getParameter("idPaisOrigen")));
		dto.setIdRegionOrigen(Utiles.parseInteger(request.getParameter("idRegionOrigen")));
		dto.setIdCiudadOrigen(Utiles.parseInteger(request.getParameter("idComunaOrigen")));

		dto.setIdPaisDestino(Utiles.parseInteger(request.getParameter("idPaisDestino")));
		dto.setIdRegionDestino(Utiles.parseInteger(request.getParameter("idRegionDestino")));
		dto.setIdCiudadDestino(Utiles.parseInteger(request.getParameter("idComunaDestino")));

		dto.setIdTipoUnidad(Utiles.parseInteger(request.getParameter("idUnidadCarga")));
		dto.setIdTipoMoneda(Utiles.parseInteger(request.getParameter("idTipoMoneda")));

		return dto;
	}

	private FiltroTransportistaDTO getDatosFiltro(HttpServletRequest request) {
		FiltroTransportistaDTO filtro = new FiltroTransportistaDTO();
		filtro.setFechaDesde(Utiles.stringToDate(request.getParameter("fechaDesde"), FORMATO_FECHA));
		filtro.setFechaHasta(Utiles.stringToDate(request.getParameter("fechaHasta"), FORMATO_FECHA));

		filtro.setIdPaisOrigen(Utiles.parseInteger(request.getParameter("idPaisOrigen")));
		filtro.setIdRegionOrigen(Utiles.parseInteger(request.getParameter("idRegionOrigen")));
		filtro.setIdPaisDestino(Utiles.parseInteger(request.getParameter("idPaisOrigen")));
		filtro.setIdRegionDestino(Utiles.parseInteger(request.getParameter("idRegionOrigen")));

		filtro.setTipoFiltro(Utiles.sinNull(request.getParameter("tipoFiltro"), "V"));

		return filtro;
	}

}
